/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.vdab.DAO;

import be.vdab.entities.Filiaal;
import be.vdab.valueobjects.Adres;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.stereotype.Repository;

/**
 *
 * @author lok1105
 */
@Repository
class FiliaalDAOImpl implements FiliaalDAO {

    private final Map<Long, Filiaal> filialen = 
            new ConcurrentHashMap<Long, Filiaal>();
    
    public FiliaalDAOImpl () {
        try {
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            filialen.put(1L, new Filiaal(1L, "Andros", true, new BigDecimal(1000),
                    dateFormat.parse("2009-01-01"), 
                    new Adres("Keizerslaan", "11", 1000, "Brussel")));
            filialen.put(2L, new Filiaal(2L, "Delos", false, new BigDecimal(2000),
                    dateFormat.parse("2009-02-02"), 
                    new Adres("Gasthuisstraat", "31", 1000, "Brussel")));
            filialen.put(3L, new Filiaal(3L, "Gavdos", false, new BigDecimal(3000),
                    dateFormat.parse("2009-03-03"), 
                    new Adres("Koestraat", "44", 9700, "Oudenaarde")));
        } catch (ParseException ex) {
            System.out.println("Verkeerde datum ingebruikname.");
        }
    }
    
    @Override
    public void create(Filiaal filiaal) {
        filiaal.setId(Collections.max(filialen.keySet()) + 1);
        filialen.put(filiaal.getId(), filiaal);
    }

    @Override
    public Filiaal read(long id) {
        return filialen.get(id);
    }

    @Override
    public void update(Filiaal filiaal) {
        filialen.put(filiaal.getId(), filiaal);
    }

    @Override
    public void delete(long id) {
        filialen.remove(id);
    }

    @Override
    public List<Filiaal> findAll() {
        return new ArrayList<Filiaal>(filialen.values());
    }

    @Override
    public List<Filiaal> findByPostcode(int van, int tot) {
        List<Filiaal> vanTotFilialen = new ArrayList<Filiaal>();
        for (Filiaal filiaal : filialen.values()) {
            int postcode = filiaal.getAdres().getPostcode();
            if (postcode >= van && postcode <= tot) {
                vanTotFilialen.add(filiaal);
            }
        }
        return vanTotFilialen;
    }

    @Override
    public int findAantalFilialen() {
        return filialen.size();
    }
    
}
